#ifndef LOGINWIDGET_H
#define LOGINWIDGET_H

#include <QWidget>

#include <QThread>



#include "./widgets/loginWidget/subWidgets/logininputwidget.h"
#include "./widgets/loginWidget/subWidgets/loginwaitingwidget.h"
#include "./widgets/mainWindow/mainwindow.h"


namespace Ui {
class LoginWidget;
}

class LoginWidget : public QWidget
{
    Q_OBJECT

public:
    explicit LoginWidget(QWidget *parent = nullptr);
    ~LoginWidget();

private slots:


    /* 接受来自Handler线程的信号 */
    // 处理登录回应
    void DealLoginResponseMessage(const QString status, const QString reason);

    /* 接受同UI线程下的主窗口信号 */
    // 主窗口点击登出后
    void clearMainWindow(MainWindow*);

    /* 接受自己控件的信号 */
    // 点击登录按钮后
    void OnLoginBtnClicked();
    // 注册按钮点击后
    void OnRegisterBtnClicked();

    /* 接受DBService线程的信号 */
    // 本地数据库加载完毕
    void onDBSuccessfulLoaded();


signals:
    /* 发给Handler线程 */
    // 验证id、密码是否正确
    void sendLoginInfo(const QString userId, const QString password);
    // 主窗口加载完毕信号，可以请求服务器传来下线时代为接受的消息等
    void mainWindowIsReady(QString userId);

    /* 发给网络收发线程 */
    // 尝试连接服务器
    void tryConnectToServer();

    /* 发给DBService线程 */
    // 初始化数据库
    void tryInitLocalDB(const QString userId, const QString password);



private:
    Ui::LoginWidget *ui;
    LoginInputWidget* m_loginInputWidget;
    LoginWaitingWidget* m_loginWaitingWidget;

    QThread* tcpServerThread;
    QThread* handlerThread;
    QThread* dbServiceThread;

    int m_shadowWidth;   // 窗体的阴影边框宽度
    int m_radius;  // 圆角半径

    QPixmap m_shadowCache;  // 缓存窗口阴影，省略阴影计算，提高渲染速度
    QPixmap m_backgroundCache;  // 缓存背景图片,省略文件读取操作，提高渲染速度

    void InitUI();
    void InitThread();

    void ConnectionStatusTip(bool, QString);


protected:
    void paintEvent(QPaintEvent *event) override;
    void resizeEvent(QResizeEvent *event) override;

};

#endif // LOGINWIDGET_H
